package pe.gob.osinergmin.interfase_siaf.service.ws;

import java.util.HashMap;
import java.util.Map;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;

import pe.gob.osinergmin.interfase_siaf.dac.bean.CertCabConsultaBean;
import pe.gob.osinergmin.interfase_siaf.dac.bean.CertificacionBean;
import pe.gob.osinergmin.interfase_siaf.dac.bean.GastosBean;
import pe.gob.osinergmin.interfase_siaf.dac.bean.IngresosBean;
import pe.gob.osinergmin.interfase_siaf.dac.bean.IntfCabConsultaBean;
import pe.gob.osinergmin.interfase_siaf.dac.bean.ResultadoBean;
import pe.gob.osinergmin.interfase_siaf.dac.certificacion.service.CertificacionService;
import pe.gob.osinergmin.interfase_siaf.dac.certificacion.service.ConsultarCertCabService;
import pe.gob.osinergmin.interfase_siaf.dac.gasto.service.GastoService;
import pe.gob.osinergmin.interfase_siaf.dac.ingreso.service.ConsultarIntCabService;
import pe.gob.osinergmin.interfase_siaf.dac.ingreso.service.IngresoService;
import pe.gob.osinergmin.interfase_siaf.dac.service.MostrarDatosService;
import pe.gob.osinergmin.interfase_siaf.dac.service.PresupuestoService;
import pe.gob.osinergmin.interfase_siaf.dac.util.Constantes;


@WebService(targetNamespace = "http://ws.service.interfase_siaf.osinergmin.gob.pe/", portName = "InterfaseSiafServiceImplPort", serviceName = "InterfaseSiafServiceImplService")
public class InterfaseSiafServiceImpl implements InterfaseSiafService {

	
	private final Log logger = LogFactory.getLog(getClass());
	
	
	public static final String CODIGO_VERIFICACION_OK ="1";
	public static final String CODIGO_VERIFICACION_ERROR ="0";
	
	
	@Autowired
	private IngresoService ingresoService;
	
	@Autowired
	private MostrarDatosService mostrarDatosService;
	
	@Autowired
	private ConsultarIntCabService consultarIntCabService;	
	
	@Autowired
	private GastoService gastoService;
	
	@Autowired
	private CertificacionService certificacionService;
	
	@Autowired
	private ConsultarCertCabService consultarCertCabService;
	
	@Autowired
	private PresupuestoService presupuestoService;
	
	
	
	/***Implementacion de metodos****/	
	@WebMethod(operationName = "buscarDatos", action = "urn:BuscarDatos")
	@WebResult(name = "listaConceptos")
	@Override
	public ResultadoBean consultarDatos(
			@WebParam(name = "codigoConcepto") String codigoConcepto, 
			@WebParam(name = "codigo1") String codigo1,
			@WebParam(name = "codigo2") String codigo2) {
		
		ResultadoBean resu =new ResultadoBean();
		try {
			 if(Constantes.RUBRO.equalsIgnoreCase(codigoConcepto) ||
					 Constantes.ORIGEN.equalsIgnoreCase(codigoConcepto)){
				 if(StringUtils.isBlank(codigo1)){
					resu.setCodResultado(Constantes.CODIGO_ANIO_EJE_NULL);
					resu.setDescResultado(Constantes.DESC_ANIO_EJE_NULL); 
				 }else{
					 resu = mostrarDatosService.mostrarConsulta(codigoConcepto, codigo1, codigo2); 
				 }			 
			 }else{
				 resu = mostrarDatosService.mostrarConsulta(codigoConcepto, codigo1, codigo2);   
			 }				
		} catch (Exception e) {
			resu.setCodResultado(Constantes.CODIGO_ERRROR_CONSULTA_CONCEPTO);
			resu.setDescResultado(Constantes.DESC_ERRROR_CONSULTA_CONCEPTO);
			logger.info("Error al mostrar datos");		
		}
		return resu;
	}

	@WebMethod(operationName = "registrarIngresos", action = "urn:RegistrarIngresos")
	@WebResult(name = "resultado")
	@Override
	public ResultadoBean grabarDatosIngresos(
			@WebParam(name = "ingresos") IngresosBean ingresos) {
		
		ResultadoBean r = new ResultadoBean();
		try {
			Map<String, Object> params = new HashMap<String, Object>();
			//Parametros
			params.put("ciclo", ingresos.getaParametros().getCiclo());
			params.put("fase", ingresos.getaParametros().getFase());
			//Datos
			params.put("cab", ingresos.getdDatos().getINTF_CAB());			
			params.put("det", ingresos.getdDatos().getINTF_DET09());
			params.put("not", ingresos.getdDatos().getINTF_NOT());	
			
			String valor = ingresoService.insertDatosIngresos(params);
			String[] mensaje = valor.split("/");
			if(CODIGO_VERIFICACION_OK.equals(mensaje[0])){  
			 r.setCodResultado(Constantes.COD_OPERACION_CORRECTO_INRESO);
			 r.setDescResultado(Constantes.OPERACION_CORRECTO_INRESO); 
			}else if(CODIGO_VERIFICACION_ERROR.equals(mensaje[0])){ 
				r.setCodResultado(Constantes.COD_OPERACION_INGRESO_DES_ERROR);
				r.setDescResultado(Constantes.OPERACION_INGRESO_DES_ERROR); 
			}else{
				r.setCodResultado(mensaje[0]);
				r.setDescResultado(mensaje[1]); 	
			}
		} catch (Exception e) {
			logger.info("Ocurrio un error al insertar datos en ingresos"+e);			
		    r.setCodResultado(Constantes.COD_OPERACION_INGRESO_DES_ERROR);
			r.setDescResultado(Constantes.OPERACION_INGRESO_DES_ERROR); 		
		}
		return r;
	}

	@WebMethod(operationName = "consultarDatosIntfCabIngresos", action = "urn:ConsultarDatosIntfCabIngresos")
	@WebResult(name = "resultadoIntfCab")
	@Override
	public IntfCabConsultaBean consultarDatosIntfCabIngresos(
			@WebParam(name = "secuencial") String secuencial) {
		
		IntfCabConsultaBean r = new IntfCabConsultaBean();;
		try {
			if(StringUtils.isNoneBlank(secuencial)){ 
			   r = consultarIntCabService.consultarIntfCabXSecuencial(secuencial);		
			}else{				
				r.setCodigo(Constantes.COD_OPERACION_CONSULTA_INTF_CAB_SECUENCIAL); 
				r.setResultado(Constantes.OPERACION_CONSULTA_INTF_CAB_SECUENCIAL); 
			}		  
		} catch (Exception e) {			
			r.setCodigo(Constantes.COD_OPERACION_CONSULTA_DES_ERROR);
			r.setResultado(Constantes.OPERACION_CONSULTA_DES_ERROR); 
			logger.info("Error al consultar datos de intf_cab por el  número de secuencial"); 
		}
		 return r;
	}
	
	
	
	/*****CERTIFICACION****/
	@WebMethod(operationName = "registrarCertificacion", action = "urn:RegistrarCertificacion")
	@WebResult(name = "resultado")
	@Override
	public ResultadoBean grabarDatosCertificacion(
			@WebParam(name = "certificacion") CertificacionBean certificacion) {
		
		ResultadoBean r = new ResultadoBean();
		try {
			Map<String, Object> params = new HashMap<String, Object>();
			//Parametros
			params.put("ciclo", certificacion.getaParametros().getCiclo());
			params.put("fase", certificacion.getaParametros().getFase());
			//Datos
			params.put("cab", certificacion.getdDatos().getCERT_CAB());			
			params.put("det", certificacion.getdDatos().getCERT_DET());			
			
			String valor = certificacionService.insertDatosCertificacion(params);
			String[] mensaje = valor.split("/");
			if(CODIGO_VERIFICACION_OK.equals(mensaje[0])){  
			 r.setCodResultado(Constantes.COD_OPERACION_CORRECTO_INRESO);
			 r.setDescResultado(Constantes.OPERACION_CORRECTO_INRESO); 
			}else if(CODIGO_VERIFICACION_ERROR.equals(mensaje[0])){ 
				r.setCodResultado(Constantes.COD_OPERACION_INGRESO_DES_ERROR);
				r.setDescResultado(Constantes.OPERACION_INGRESO_DES_ERROR); 
			}else{
				r.setCodResultado(mensaje[0]);
				r.setDescResultado(mensaje[1]); 	
			}
		} catch (Exception e) {
			logger.info("Ocurrio un error al insertar datos en certificacion"+e);			
		    r.setCodResultado(Constantes.COD_OPERACION_INGRESO_DES_ERROR);
			r.setDescResultado(Constantes.OPERACION_INGRESO_DES_ERROR); 		
		}
		return r;
	}
	
	
	@WebMethod(operationName = "consultarDatosCertCabCertificado", action = "urn:ConsultarDatosCertCabCertificado")
	@WebResult(name = "resultadoCertCab")
	@Override
	public CertCabConsultaBean consultarDatosCertCabCertificado(
			@WebParam(name = "secuencial") String secuencial) {
		
		CertCabConsultaBean r = new CertCabConsultaBean();;
		try {
			if(StringUtils.isNoneBlank(secuencial)){ 
			   r = consultarCertCabService.consultarCertCabXSecuencial(secuencial);		
			}else{				
				r.setCodigo(Constantes.COD_OPERACION_CONSULTA_INTF_CAB_SECUENCIAL); 
				r.setResultado(Constantes.OPERACION_CONSULTA_INTF_CAB_SECUENCIAL); 
			}		  
		} catch (Exception e) {			
			r.setCodigo(Constantes.COD_OPERACION_CONSULTA_CERT_DES_ERROR);
			r.setResultado(Constantes.OPERACION_CONSULTA_CERT_DES_ERROR); 
			logger.info("Error al consultar datos de cert_cab por el  número de secuencial"); 
		}
		 return r;
	}
	
	
     /******GASTOS*********/	
	@WebMethod(operationName = "registrarGastos", action = "urn:RegistrarGastos")
	@WebResult(name = "resultado")
	@Override
	public ResultadoBean grabarDatosGastos(
			@WebParam(name = "gastos") GastosBean gastos) {
		
		ResultadoBean r = new ResultadoBean();
		try {			
			Map<String, Object> params = new HashMap<String, Object>();
			//Parametros
			params.put("ciclo", gastos.getaParametros().getCiclo());
			params.put("fase", gastos.getaParametros().getFase());
			//Datos
			params.put("cab", gastos.getdDatos().getIntfCab());			
			params.put("det", gastos.getdDatos().getIntfDet09());
			params.put("not", gastos.getdDatos().getIntfNot());	
			
			String valor = gastoService.insertDatosGastos(params);	
			String[] mensaje = valor.split("/");
			if(CODIGO_VERIFICACION_OK.equals(mensaje[0])){  
			 r.setCodResultado(Constantes.COD_OPERACION_CORRECTO_INRESO);
			 r.setDescResultado(Constantes.OPERACION_CORRECTO_INRESO); 
			}else if(CODIGO_VERIFICACION_ERROR.equals(mensaje[0])){ 
				r.setCodResultado(Constantes.COD_OPERACION_INGRESO_DES_ERROR);
				r.setDescResultado(Constantes.OPERACION_INGRESO_DES_ERROR); 
			}else{
				r.setCodResultado(mensaje[0]);
				r.setDescResultado(mensaje[1]); 	
			}
		} catch (Exception e) {
			logger.info("Ocurrio un error al insertar datos en ingresos: "+e);			
			 r.setCodResultado(Constantes.COD_OPERACION_INGRESO_DES_ERROR);
			 r.setDescResultado(Constantes.OPERACION_INGRESO_DES_ERROR); 
			e.printStackTrace();
		}
		return r;
	}	
	
	/**Metodo para consultar presupuesto*/	
	@WebMethod(operationName = "buscarPresupuesto", action = "urn:BuscarPresupuesto")
	@WebResult(name = "listaPresupuesto")
	@Override
	public ResultadoBean buscarPresupuesto(
			@WebParam(name = "anioEjecucion") String anioEjec, 
			@WebParam(name = "secuenciaFuncional") String secFunc,
			@WebParam(name = "idClasificador") String idClasificador) {
		
		ResultadoBean resu =new ResultadoBean();
		try {
			if(StringUtils.isNoneBlank(anioEjec)){ 
				resu = presupuestoService.buscarPresupuesto(anioEjec, secFunc, idClasificador);	
			}else{				
				resu.setCodResultado(Constantes.COD_OPERACION_CONSULTA_PRESUPUESTO); 
				resu.setDescResultado(Constantes.OPERACION_CONSULTA_PRESUPUESTO); 
			}		 	
		} catch (Exception e) {
			resu.setCodResultado(Constantes.CODIGO_ERRROR_CONSULTA_PRESUPUESTO);
			resu.setDescResultado(Constantes.DESC_ERRROR_CONSULTA_PRESUPUESTO);
			logger.info("Error al mostrar datos presupuesto");		
		}
		return resu;
	}
	   

}
